<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Calculator With Memory
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora029.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora031.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Calculator With Memory</H2><A NAME="calc-v2"></A>
We now reuse the calculator example described in the preceding
chapter, but this time we give it a user interface, which makes our
program more usable as a desktop calculator. This loop allows entering
operations directly and seeing results displayed without having to
explicitly apply a transition function for each keypress.<BR>
<BR>
We attach four new keys: <B>C</B>, which resets the display to zero,
 <B>M</B>, which memorizes a result, <B>m</B>, which recalls this memory and
<B>OFF</B>, which turns off the calculator.
This corresponds to the following type:


<PRE><BR># <B>type</B><CODE> </CODE>key<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Plus<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Minus<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Times<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Div<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Equals<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Digit<CODE> </CODE><B>of</B><CODE> </CODE>int<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Store<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Recall<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Clear<CODE> </CODE><CODE>|</CODE><CODE> </CODE>Off<CODE> </CODE>;;<BR>

</PRE>
<BR>
<BR>
It is necessary to define a translation function from characters
typed on the keyboard to values of type <I>key</I>. The exception
<TT>Invalid_key</TT> handles the case of characters that do not
represent any key of the calculator. The function <TT>code</TT> of module
<TT>Char</TT> translates a character to its ASCII-code.


<PRE><BR># <B>exception</B><CODE> </CODE>Invalid_key<CODE> </CODE>;;<BR><CODE>exception Invalid_key</CODE><BR># <B>let</B><CODE> </CODE>translation<CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>c<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>'+'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Plus<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'-'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Minus<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'*'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Times<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'/'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Div<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'='</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Equals<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'C'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'c'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Clear<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'M'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Store<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'m'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Recall<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'o'</CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'O'</CODE><CODE> </CODE>-&gt;<CODE> </CODE>Off<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>'0'</CODE><CODE>..</CODE><CODE>'9'</CODE><CODE> </CODE><B>as</B><CODE> </CODE>c<CODE> </CODE>-&gt;<CODE> </CODE>Digit<CODE> </CODE><TT>(</TT><TT>(</TT>Char.code<CODE> </CODE>c<TT>)</TT><CODE> </CODE><CODE>-</CODE><CODE> </CODE><TT>(</TT>Char.code<CODE> </CODE><CODE>'0'</CODE><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>Invalid_key<CODE> </CODE>;;<BR><CODE>val translation : char -&gt; key = &lt;fun&gt;</CODE><BR>

</PRE>
<BR>
<BR>
In imperative style, the translation function does not calculate a new
state, but physically modifies the state of the calculator. Therefore, it is
necessary to redefine the type <TT>state</TT> such that the fields are
modifiable. Finally, we define the exception <TT>Key_off</TT> for treating the
activation of the key <B>OFF</B>.


<PRE><BR># <B>type</B><CODE> </CODE>state<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<BR><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>lcd<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><CODE> </CODE><CODE>(* last computation done   *)</CODE><BR><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>lka<CODE> </CODE><CODE>:</CODE><CODE> </CODE>bool;<CODE> </CODE><CODE>(* last key activated      *)</CODE><BR><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>loa<CODE> </CODE><CODE>:</CODE><CODE> </CODE>key;<CODE> </CODE><CODE> </CODE><CODE>(* last operator activated *)</CODE><BR><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>vpr<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int;<CODE> </CODE><CODE> </CODE><CODE>(* value printed           *)</CODE><BR><CODE> </CODE><CODE> </CODE><B>mutable</B><CODE> </CODE>mem<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>(* memory of calculator    *)</CODE><BR><CODE> </CODE>};;<BR>

</PRE>
<BR>
<BR>


<PRE><BR># <B>exception</B><CODE> </CODE>Key_off<CODE> </CODE>;;<BR><CODE>exception Key_off</CODE><BR># <B>let</B><CODE> </CODE>transition<CODE> </CODE>s<CODE> </CODE>key<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>key<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Clear<CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Digit<CODE> </CODE>n<CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><TT>(</TT><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE>.</CODE>lka<CODE> </CODE><B>then</B><CODE> </CODE>s<CODE>.</CODE>vpr<CODE>*</CODE><CODE>1</CODE><CODE>0</CODE><CODE>+</CODE>n<CODE> </CODE><B>else</B><CODE> </CODE>n<CODE> </CODE><TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>lka<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><B>true</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Store<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>lka<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><B>false</B><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>mem<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Recall<CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>lka<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><B>false</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>s<CODE>.</CODE>mem<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Off<CODE> </CODE>-&gt;<CODE> </CODE>raise<CODE> </CODE>Key_off<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE><B>let</B><CODE> </CODE>lcd<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>s<CODE>.</CODE>loa<CODE> </CODE><B>with</B><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Plus<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>lcd<CODE> </CODE><CODE>+</CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Minus<CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>lcd<CODE> </CODE><CODE>-</CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Times<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>lcd<CODE> </CODE><CODE>*</CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Div<CODE> </CODE><CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>lcd<CODE> </CODE><CODE>/</CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Equals<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE>s<CODE>.</CODE>vpr<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE> </CODE><CODE>"transition: impossible match"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>lcd<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>lcd<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>lka<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><B>false</B><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>loa<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>key<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>s<CODE>.</CODE>vpr<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>s<CODE>.</CODE>lcd;;<BR><CODE>val transition : state -&gt; key -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>
<BR>
<BR>
We define the function <TT>go</TT>, which starts the calculator.
Its return value is <TT>()</TT>, because we are only concerned about
effects produced by the execution on the environment (start/end,
modification of state). Its argument is also the constant <TT>()</TT>,
because the calculator is autonomous (it defines its own initial state)
and interactive (the arguments of the computation are entered on the
keyboard as required). The transitions are performed within an infinite
loop (<B>while</B> <EM>true</EM> <B>do</B>) so we can quit with the
exception <TT>Key_off</TT>.<BR>
<BR>


<PRE><BR># <B>let</B><CODE> </CODE>go<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>state<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<CODE> </CODE>lcd<CODE>=</CODE><CODE>0</CODE>;<CODE> </CODE>lka<CODE>=</CODE><B>false</B>;<CODE> </CODE>loa<CODE>=</CODE>Equals;<CODE> </CODE>vpr<CODE>=</CODE><CODE>0</CODE>;<CODE> </CODE>mem<CODE>=</CODE><CODE>0</CODE><CODE> </CODE>}<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>input<CODE> </CODE><CODE>=</CODE><CODE> </CODE>translation<CODE> </CODE><TT>(</TT>input_char<CODE> </CODE>stdin<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>transition<CODE> </CODE>state<CODE> </CODE>input<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_newline<CODE> </CODE>()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_string<CODE> </CODE><CODE>"result: "</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_int<CODE> </CODE>state<CODE>.</CODE>vpr<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>print_newline<CODE> </CODE>()<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Invalid_key<CODE> </CODE>-&gt;<CODE> </CODE>()<CODE> </CODE><CODE> </CODE><CODE>(* no effect *)</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Key_off<CODE> </CODE>-&gt;<CODE> </CODE>()<CODE> </CODE>;;<BR><CODE>val go : unit -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>
<BR>
<BR>
We note that the initial state must be either passed as a parameter or
declared locally within the function <TT>go</TT>, because it needs to
be initialized at every application of this function. If we had used a
value <TT>initial_state</TT> as in the functional program, the calculator
would start in the same state as the one it had when it was terminated.
This would make it difficult to use two calculators in the same program.
<BR>
<BR>
<BR>
<BR>

<BR>
<BR>
 <BR>
<BR>
<HR>
<A HREF="book-ora029.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora031.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
